#
# Set to true in case the driver needs to be debugged to
# pull in the locally build binaries rather than the ones
# from the depot.
#
set debug_driver false

source ${genode_dir}/repos/dde_linux/run/wifi_config.inc

#
# Restrict platforms
#
assert {[have_spec x86]}

#
# Build
#

create_boot_directory
import_from_depot [depot_user]/pkg/pc_wifi \
                  [depot_user]/raw/pc_wifi_firmware

set build_components {
	core init timer
	app/pci_decode
	driver/acpi
	driver/platform
	driver/rtc
	server/report_rom
	server/dynamic_rom
	server/nic_router
	test/lwip/http_srv
	lib/vfs_lwip
}

append_if $debug_driver build_components {
	driver/wifi
	lib/pc_wifi
	lib/vfs_jitterentropy
}

build $build_components

#
# Generate config
#

append config {
<config verbose="yes" prio_levels="2">
	<parent-provides>
		<service name="ROM"/>
		<service name="IRQ"/>
		<service name="IO_MEM"/>
		<service name="IO_PORT"/>
		<service name="PD"/>
		<service name="RM"/>
		<service name="CPU"/>
		<service name="LOG"/>
	</parent-provides>
	<default-route>
		<any-service> <parent/> <any-child/> </any-service>
	</default-route>
	<default caps="100" ram="1M"/>
	<start name="timer">
		<provides> <service name="Timer"/> </provides>
	</start>

	<start name="report_rom" caps="70">
		<provides>
			<service name="ROM" />
			<service name="Report" />
		</provides>
		<config verbose="yes">
			<policy label="pci_decode -> system" report="acpi -> acpi"/>
			<policy label="platform -> devices"  report="pci_decode -> devices"/>
		</config>
		<route>
			<service name="LOG"> <parent/> </service>
			<service name="PD">  <parent/> </service>
			<service name="CPU"> <parent/> </service>
			<service name="ROM"> <parent/> </service>
		</route>
	</start>

	<start name="acpi" caps="250" ram="6M">
		<route>
			<service name="IO_MEM"> <parent/> </service>
			<service name="LOG">    <parent/> </service>
			<service name="PD">     <parent/> </service>
			<service name="RM">     <parent/> </service>
			<service name="CPU">    <parent/> </service>
			<service name="ROM">    <parent/> </service>
			<service name="Report"> <child name="report_rom"/> </service>
		</route>
	</start>

	<start name="pci_decode" caps="350" ram="2M">
		<route>
			<service name="Report">
				<child name="report_rom"/> </service>
			<service name="ROM" label="system">
				<child name="report_rom"/> </service>
			<service name="IO_MEM"> <parent/> </service>
			<service name="LOG">    <parent/> </service>
			<service name="PD">     <parent/> </service>
			<service name="RM">     <parent/> </service>
			<service name="CPU">    <parent/> </service>
			<service name="ROM">    <parent/> </service>
		</route>
	</start>

	<start name="platform" caps="100" ram="2M" managing_system="yes">
		<provides> <service name="Platform"/> </provides>
		<route>
			<service name="ROM" label="devices"> <child name="report_rom"/> </service>
			<service name="Timer">   <child name="timer"/> </service>
			<service name="IRQ">     <parent/> </service>
			<service name="IO_MEM">  <parent/> </service>
			<service name="IO_PORT"> <parent/> </service>
			<service name="ROM">     <parent/> </service>
			<service name="PD">      <parent/> </service>
			<service name="CPU">     <parent/> </service>
			<service name="LOG">     <parent/> </service>
		</route>
		<config>
			<policy label_prefix="wifi" msix="false" info="yes">
				<pci class="WIFI"/>
			</policy>
		</config>
	</start>

	<start name="pc_rtc">
		<provides> <service name="Rtc"/> </provides>
	</start>

	<start name="test-lwip_httpsrv" ram="128M">
		<config>
			<libc stdout="/dev/null" stderr="/dev/log" socket="/socket"/>
			<vfs>
				<dir name="dev"> <log/> <null/> </dir>
				<dir name="socket"> <lwip dhcp="yes"/> </dir>
			</vfs>
		</config>
		<route>
			<service name="Nic"> <child name="nic_router"/> </service>
			<any-service> <parent/> <any-child/> </any-service>
		</route>
	</start>

	<start name="state_report_rom" ram="2M">
		<binary name="report_rom"/>
		<provides> <service name="Report"/> <service name="ROM"/> </provides>
		<config verbose="no"/>
	</start>

	<start name="accesspoints_report_rom" ram="2M">
		<binary name="report_rom"/>
		<provides> <service name="Report"/> <service name="ROM"/> </provides>
		<config verbose="no"/>
	</start>

	<start name="config_rom" ram="4M">
		<binary name="dynamic_rom"/>
		<provides><service name="ROM"/></provides>
		<config verbose="yes">
			<rom name="wifi_config">
				<inline description="disconnect">
} [wifi_config 5 10 no {}] {
				</inline>
				<sleep milliseconds="15000"/>
				<inline description="connect">
} [wifi_config 5 10 no [list "[wifi_ssid] [wifi_wpa] [wifi_psk] no"]] {
				</inline>
				<sleep milliseconds="60000"/>
				<inline description="rfkill block">
} [wifi_config 5 10 yes [list "[wifi_ssid] [wifi_wpa] [wifi_psk] no"]] {
				</inline>
				<sleep milliseconds="30000"/>
				<inline description="rfkill unblock">
} [wifi_config 5 10 no [list "[wifi_ssid] [wifi_wpa] [wifi_psk] no"]] {
				</inline>
				<sleep milliseconds="30000"/>
			</rom>
		</config>
	</start>

	<start name="nic_router" caps="150" ram="8M">
		<provides>
			<service name="Nic"/>
			<service name="Uplink"/>
		</provides>
		<config verbose="no" verbose_domain_state="yes" dhcp_discover_timeout_sec="10" dhcp_request_timeout_sec="6">

			<policy label_prefix="test-lwip_httpsrv" domain="downlink"/>
			<policy label_prefix="wifi"              domain="uplink"/>

			<domain name="uplink" verbose_packets="no" verbose_packet_drop="no" icmp_echo_server="yes">

				<nat domain="downlink" tcp-ports="16384"/>
				<tcp-forward port="443" domain="downlink" to="10.0.3.2"/>
				<tcp-forward port="80"  domain="downlink" to="10.0.3.2"/>

			</domain>

			<domain name="downlink" verbose_packets="no" verbose_packet_drop="no" interface="10.0.3.1/24">

				<dhcp-server ip_first="10.0.3.2" ip_last="10.0.3.2"/>

			</domain>

		</config>
	</start>

	<start name="devices_report_rom" ram="1200K">
		<binary name="report_rom"/>
		<provides> <service name="Report"/> <service name="ROM"/> </provides>
		<config verbose="yes"/>
	</start>

	<start name="wifi" caps="260" ram="32M" priority="-1">
		<config ld_verbose="yes">
			<report mac_address="true"/>
			<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" rng="/dev/urandom"/>
			<vfs>
				<dir name="dev"> <log/> <null/> <rtc/>
					<jitterentropy name="random"/>
					<jitterentropy name="urandom"/>
				</dir>
				<dir name="firmware">
					<tar name="wifi_firmware.tar"/>
				</dir>
			</vfs>
		</config>
		<route>
			<service name="Uplink"> <child name="nic_router"/> </service>
			<service name="Rtc"> <any-child/> </service>
			<service name="Report" label="accesspoints"> <child name="accesspoints_report_rom"/> </service>
			<service name="Report" label="state"> <child name="state_report_rom"/> </service>
			<service name="Report" label="devices"> <child name="devices_report_rom"/> </service>
			<service name="ROM" label="wifi_config"> <child name="config_rom"/> </service>
			<service name="ROM" label="wifi.lib.so"> <parent label="pc_wifi.lib.so"/> </service>
			<service name="ROM" label="wifi_firmware.tar"> <parent label="pc_wifi_firmware.tar"/> </service>
			<any-service> <parent/> <any-child/> </any-service>
		</route>
	</start>
</config>
}

install_config $config

#
# Provide dummy 'wifi.lib.so' shared-object for
# boot-module assembly
#
if {$debug_driver} {
catch {exec rm bin/wifi.lib.so}
exec echo dummy > bin/wifi.lib.so
}


#
# Boot modules
#

build_boot_image [build_artifacts]

run_genode_until forever

# vi: set ft=tcl :
